<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 一般情况下  函数在执行完 就结束了 => 内部的局部变量 作用域 执行空间 就被释放了
    // function fn(){
    //     var num = 10;
    //     return ++num;
    // }
    // var result = fn();
    // console.log(result);
    // var result = fn();
    // console.log(result);
    // var result = fn();
    // console.log(result);

    // 什么是闭包?
    // 闭包是指    有权访问另一个函数作用域中的变量    的函数。
    // 简单的来说  就是 一个函数在执行过程中 返回另一个函数/对象 (引用类型   一般都是函数 =>子函数引用了父函数中变量)

    function fn(){
        var num = 10; // 11  12
        return function(){
            // debugger;
            num++;
            return num;
        };
    }

    // debugger;
    var newFn = fn();
    console.log(newFn);

    var result = newFn();
    console.log(result);

    var result = newFn();
    console.log(result);

    var result = newFn();
    console.log(result);


    // var newFn1 = fn();



    function makeIterator(array) {
        var nextIndex = 0; // 1
        return {
            next: function() {
                return nextIndex < array.length ?
                    {value: array[nextIndex++], done: false} :
                    {value: undefined, done: true};
             }
        }
    }

    var obj = makeIterator([1,2,3,4]);
    console.log(obj);

    var result = obj.next();
    console.log(result);
    var result = obj.next();
    console.log(result);
    var result = obj.next();
    console.log(result);
    var result = obj.next();
    console.log(result);
    var result = obj.next();
    console.log(result);

</script>
</html>